package iso3.pt.action;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import iso3.pt.model.Alumno;
import iso3.pt.model.Asignatura;
import iso3.pt.model.Evaluacion;
import iso3.pt.service.*;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

public class StudentAction extends ActionSupport implements Preparable
{
	private static final long serialVersionUID = 1L;
	private Alumno alumno;
	private Asignatura asignatura;
	private List<Asignatura> listaAsignaturasMatriculadas;
	private List<Asignatura> listaTodasAsignaturas;
	private int subjectID;
	private PtDaoService hibernateDAO = null;
	private List<Evaluacion> listaEvaluaciones;
	
//get y sets-------------------------------------------------------

	public List<Asignatura> getListaTodasAsignaturas() {
		return listaTodasAsignaturas;
	}

	public void setListaTodasAsignaturas(List<Asignatura> listaTodasAsignaturas) {
		this.listaTodasAsignaturas = listaTodasAsignaturas;
	}

	public Asignatura getAsignatura() {
		return asignatura;
	}

	public void setAsignatura(Asignatura asignatura) {
		this.asignatura = asignatura;
	}

	public List<Evaluacion> getListaEvaluaciones() {
		return listaEvaluaciones;
	}

	public void setListaEvaluaciones(List<Evaluacion> listaEvaluaciones) {
		this.listaEvaluaciones = listaEvaluaciones;
	}

	public PtDaoService getHibernateDAO() {
		return hibernateDAO;
	}

	public void setHibernateDAO(PtDaoService hibernateDAO) {
		this.hibernateDAO = hibernateDAO;
	}

	public List<Evaluacion> getlistaEvaluaciones() {
		return listaEvaluaciones;
	}

	public void setlistaEvaluaciones(List<Evaluacion> listaEvaluaciones) {
		this.listaEvaluaciones = listaEvaluaciones;
	}

	public Alumno getAlumno() {
		return alumno;
	}

	public void setAlumno(Alumno alumno) {
		this.alumno = alumno;
	}

	public List<Asignatura> getListaAsignaturasMatriculadas() {
		return listaAsignaturasMatriculadas;
	}

	public void setListaAsignaturasMatriculadas(
			List<Asignatura> listaAsignaturasMatriculadas) {
		this.listaAsignaturasMatriculadas = listaAsignaturasMatriculadas;
	}

	public int getSubjectID() {
		return subjectID;
	}

	public void setSubjectID(int subjectID) {
		this.subjectID = subjectID;
	}
	
//FIN get y sets-------------------------------------------------------
	
	public void loadList()
	{
		this.listaAsignaturasMatriculadas = new ArrayList<Asignatura>();
		try
		{
			for (Iterator<Asignatura> i = this.hibernateDAO.getAsignaturas(this.alumno.getDni()).iterator(); i.hasNext();)
			{
				Asignatura asig = i.next();
				this.listaAsignaturasMatriculadas.add(asig);
			}
		}catch(Exception e)
		{
			System.out.println(e.getMessage());
		}
	}
	
	public void prepare() throws Exception
	{
		if (this.hibernateDAO == null){
			this.hibernateDAO= new PtDaoService();
		}
		this.alumno = (Alumno)ActionContext.getContext().getSession().get("logged-in");
		this.loadList();	
	}
	
//do's-------------------------------------------------------
	
	public String doListSubjects()
	{
		//cuando llamamos con chain, no funciona bien en prepare el sacar el alumno de la sesion, asi que lo sacamos otra vez porseacaso
		this.alumno = (Alumno)ActionContext.getContext().getSession().get("logged-in");
		return SUCCESS;
	}
	public String doLogout()
	{
		//logout
		@SuppressWarnings("rawtypes")
		Map session = ActionContext.getContext().getSession();
	  
	  	if (session.get("logged-in") != null)
	  		session.remove("logged-in"); 
		
		return "logout";
	}
	public String unEnroll()
	{
		System.out.println("Desmatriculando:" + this.alumno.getDni()+"//"+this.subjectID);
		this.hibernateDAO.desmatricular(this.alumno.getDni(), this.subjectID);
		
		/*entre otras cosas se hace para mantener la sesion viva por la carga lazy (si no casca porque se 
		accede a objetos que no estan, debido a que hibernate crea unos threads y persisten aunque muera
		 el objeto)*/
		this.loadList();
		return "unEnroll";
	}
	
	public String doEnrollNewSubjectForm()
	{
		this.listaTodasAsignaturas = new ArrayList<Asignatura>();
		
		for (Iterator<Asignatura> i = this.hibernateDAO.getAsignaturas().iterator(); i.hasNext();)
		{
			Asignatura asig = i.next();
			this.listaTodasAsignaturas.add(asig);
		}
		return "enrollNewForm";
	}
	
	public String doEnrollNew()
	{	
		this.hibernateDAO.matricular(this.alumno.getDni(), this.subjectID);
		this.loadList();
		return "enrollNew";
	}
	
//fin do's-------------------------------------------------------
	
}
